<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>

        /* 
        
            当变量名 和函数名 重名的时候  
            预解析阶段  以函数名为准  
        
        
        */
        // fn1();
        // function fn1(){
        //     console.log('fn1函数');
        // }

        // fn1();
        // var fn1 = 100;
        // fn1()

        // 开始预解析  

        // 第一行 不预解析   
        // 第二行  预解析  
        //      声明一个变量 fn1 赋值为一个函数 
        // 第三行 不预解析  
        // 第四行 预解析  
        // 正常应该是 声明一个变量 fn1 但是不赋值 
        // 但是 已经有了一个变量fn1 里边是函数  所以 这里 不声明新的变量 
        // 也就是以函数名为准   等于是 fn1 里边是个函数  
        // 第五行 不预解析  


        // 预解析结束  


        // 存在fn1这个变量   里边是个函数  

        // 开始执行  
        // 因为预解析结束 fn1是个函数 
        // 所以 前两个 fn1() 正常调用 


        // var fn1 = 100  这一行  将 100赋值给fn1 
        // fn1 里边由函数变成  100 
        // 此时 fn1不再是函数   

        // 所以 最后一个fn1() 报错  
        // 提示 fn1 is not a function  

        // fn2()
        // var fn2 = 100;
        // fn2()
        // function fn2(){
        //     console.log('我是fn2函数')
        // }

        // fn2()


        // 打来浏览器 
        // fn2()
        // var fn2 = 100;
        // fn2()
        // function fn2(){
        //     console.log('我是fn2函数')
        // }

        // fn2()


        // 开始预解析  
        // fn2() 不需要 
        //  var fn2 = 100; 声明一个变量 但是不赋值  fn2 里边是undefined 
        // fn2() 不预解析 
        // 声明一个变量 fn2 跟上面重名 以这个函数为准 把函数赋值给这个变量
        // fn2 不预解析  

        

        // 预解析结束  fn2 是个函数  

        // 开始调用  
        // 第一个fn2() 正常调用  

        // 接下来  把100 赋值给fn2 
        // fn2 不再是函数了  
        // 接下来 fn2()  报错  fn2 is not a function  
        // 一旦报错 后面的代码 不执行 


        // var num = 100;
        // function fn3(){
        //     console.log(num)
        // }
        // num = 200;
        // fn3();

        // fn3();


        // 开始预解析 

        // 声明变量  num 但是不赋值  
        // 声明变量 fn3 并且赋值一个函数  
        // 不预解析 
        // 不预解析
        // 不预解析

        // 预解析结束 存在 num 变量  里边是 undefined 
        // 存在 fn3 是个函数  


        // 开始执行  
        // 把100赋值给num 
        // 200给到num 

        /// fn3() 调用  内部预解析  (里边不需要预解析 最后把num的值输出到控制台)
        /// fn3() 调用  内部预解析  (里边不需要预解析 最后把num的值输出到控制台)



  

    </script>
</body>
</html>